(function () {
  /**
   * 继承原则--OPC开闭原则
   * 开放扩展，关闭修改
   * 开放扩展：子类可以继承父类的属性和方法
   * 关闭修改：子类不能修改父类的属性和方法
   */
  class Animal {
    name: string;
    age: number;
    constructor(name: string, age: number) {
      this.name = name;
      this.age = age;
    }
    sayHello() {
      console.log("动物在叫");
    }
  }

  /**
   * Dog extends Animal
   * - Animal被称为父类，Dog被称为子类
   * - 使用继承后，子类将用用父类所有的方法和属性
   */
  // 定义一个表示狗的类
  // 使Dog类继承Animal类
  class Dog extends Animal {
    sayHello() {
      console.log("汪汪汪");
    }
  }
  // 定义一个表示猫的类
  // 使Cat类继承Animal类
  class Cat extends Animal {
    sayHello() {
      console.log("喵喵喵");
    }
  }

  const dog = new Dog("旺财", 3);
  const cat = new Cat("咪咪", 3);
  console.log(dog);
  dog.sayHello();
  console.log(cat);
  cat.sayHello();
})();
